﻿Imports BL.BL
Imports BE.BE

Public Class frmGestionFamilias

#Region "Atributos"
    Dim mlistaTodasLasPatentes As New List(Of Patente_BE)
    Dim mlistaPatentesAsociadas As New List(Of Patente_BE)
    Dim mlistaFamilias As New List(Of Familia_BE)
    Dim mNuevo As Boolean = False
    Dim mOcultar As Boolean = False

    Private Enum Tipo
        Denegado
        Permitido
    End Enum


#End Region


#Region "Métodos"

    'load.
    Private Sub frmGestionFamilias_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        'cosmetica.
        Me.dgvFamilias.AutoGenerateColumns = False
        Me.dgvFamilias.SelectionMode = DataGridViewSelectionMode.FullRowSelect
        Me.dgvPatentesAsociadas.AutoGenerateColumns = False
        Me.dgvPatentesAsociadas.SelectionMode = DataGridViewSelectionMode.FullRowSelect
        Me.dgvPatentesDisponibles.AutoGenerateColumns = False
        Me.dgvPatentesDisponibles.SelectionMode = DataGridViewSelectionMode.FullRowSelect

        With Me.dgvFamilias
            .Columns.Add("c0", "id_familia")
            .Columns(0).DataPropertyName = "Id"
            .Columns(0).Width = 20
            .Columns(0).Visible = False
            .Columns.Add("c1", "nombre")
            .Columns(1).DataPropertyName = "Nombre"
            .Columns(1).DefaultCellStyle.Padding = New Padding(8, 0, 0, 0)
            .Columns(1).Width = 140
            .Columns(1).Visible = True
            .Columns.Add("c2", "descripción")
            .Columns(2).DataPropertyName = "Descripcion"
            .Columns(2).Width = 100
            .Columns(2).Visible = False
            .DataSource = Familia_BL.listarFamilias
        End With

        With Me.dgvPatentesAsociadas
            .Columns.Add("c0", "id_patente")
            .Columns(0).DataPropertyName = "Id"
            .Columns(0).Width = 20
            .Columns(0).Visible = False
            .Columns.Add("c1", "nombre")
            .Columns(1).DataPropertyName = "Nombre"
            .Columns(1).DefaultCellStyle.Padding = New Padding(8, 0, 0, 0)
            .Columns(1).Width = 270
            .Columns(1).Visible = True
            .Columns.Add("c2", "descripción")
            .Columns(2).DataPropertyName = "Descripcion"
            .Columns(2).Width = 100
            .Columns(2).Visible = False
            .Columns.Add("c3", "tipo")
            .Columns(3).DataPropertyName = "Tipo"
            .Columns(3).Width = 80
            .Columns(3).Visible = False
        End With

        With Me.dgvPatentesDisponibles
            .Columns.Add("c0", "id_patente")
            .Columns(0).DataPropertyName = "Id"
            .Columns(0).Width = 20
            .Columns(0).Visible = False
            .Columns.Add("c1", "nombre")
            .Columns(1).DataPropertyName = "Nombre"
            .Columns(1).DefaultCellStyle.Padding = New Padding(8, 0, 0, 0)
            .Columns(1).Width = 270
            .Columns(1).Visible = True
            .Columns.Add("c2", "descripción")
            .Columns(2).DataPropertyName = "Descripcion"
            .Columns(2).Width = 100
            .Columns(2).Visible = False
            .Columns.Add("c3", "tipo")
            .Columns(3).DataPropertyName = "Tipo"
            .Columns(3).Width = 80
            .Columns(3).Visible = False
        End With

        'cosmetica.
        Me.txtNombreFamilia.Visible = True
        Me.txtNombreFamilia.ReadOnly = True
        Me.txtDescripcionFamilia.Visible = True
        Me.txtDescripcionFamilia.ReadOnly = True
        Me.btnGrabarFamilia.Visible = False 'guardar.
        Me.dgvPatentesAsociadas.Visible = False
        Me.dgvPatentesDisponibles.Visible = False
        Me.btnAsignarPatentes.Visible = False '<<
        Me.btnDesasignarPatentes.Visible = False  '>>
        Me.btnCancelarGrabar.Visible = False
        Me.lbNombreFamilia.Visible = True
        Me.lbDescripcionFamilia.Visible = True
        Me.lbPatentesAsociadas.Visible = False
        Me.lbPatentesDisponibles.Visible = False

        Me.dgvFamilias_Click(Nothing, Nothing)

        'si hay falla de integridad de BD (tablas usuario_familia ó usuario_patente) - no seteamos patentes
        If frmPrincipal.integridad = True And frmPrincipal.usr.nick <> "suseas" Then
            'patentes del usuario logueado.
            Helper_FL.setearPermisos(frmPrincipal.usr, Me)
        End If

    End Sub


    'alta.
    Private Sub NuevaFamilia_Click(sender As Object, e As EventArgs) Handles btnNuevaFamilia.Click
        mNuevo = True
        'cosmetica.
        Me.btnNuevaFamilia.Visible = False
        Me.btnModificarFamilia.Visible = False
        Me.btnEliminarFamilia.Visible = False
        Me.btnVerPatentes.Visible = False

        Me.txtNombreFamilia.ReadOnly = False
        Me.txtNombreFamilia.Text = ""
        Me.txtDescripcionFamilia.ReadOnly = False
        Me.txtDescripcionFamilia.Text = ""
        Me.txtNombreFamilia.Focus()
        Me.btnGrabarFamilia.Visible = True
        Me.dgvPatentesAsociadas.Visible = True
        Me.dgvPatentesDisponibles.Visible = True
        Me.dgvFamilias.Enabled = False
        Me.btnAsignarPatentes.Visible = True  '<<
        Me.btnDesasignarPatentes.Visible = True   '>>
        Me.btnCancelarGrabar.Visible = True
        Me.lbNombreFamilia.Visible = True
        Me.lbDescripcionFamilia.Visible = True
        Me.lbPatentesAsociadas.Visible = True
        Me.lbPatentesDisponibles.Visible = True
        'se listan todas las patentes disponibles.
        Me.mlistaPatentesAsociadas.Clear()
        Me.mlistaTodasLasPatentes = Patente_BL.ListarTodasLasPatentes()
        ActualizarGrillas()

    End Sub


    'modificacion.
    Private Sub ModificarFamilia_Click(sender As Object, e As EventArgs) Handles btnModificarFamilia.Click

        'control lista familias vacía.
        If Me.dgvFamilias.RowCount < 1 Then
            MsgBox("No hay más familias para modificar..", MsgBoxStyle.Exclamation, "")
            Exit Sub
        End If

        'cosmetica.
        Me.btnNuevaFamilia.Visible = False
        Me.btnModificarFamilia.Visible = False
        Me.btnEliminarFamilia.Visible = False
        Me.btnVerPatentes.Visible = False

        Me.txtNombreFamilia.ReadOnly = False
        Me.txtDescripcionFamilia.ReadOnly = False
        Me.txtNombreFamilia.Focus()
        Me.btnGrabarFamilia.Visible = True
        Me.dgvPatentesAsociadas.Visible = True
        Me.dgvPatentesDisponibles.Visible = True
        Me.dgvFamilias.Enabled = False
        Me.btnAsignarPatentes.Visible = True  '<<
        Me.btnDesasignarPatentes.Visible = True   '>>
        Me.btnCancelarGrabar.Visible = True
        Me.lbNombreFamilia.Visible = True
        Me.lbDescripcionFamilia.Visible = True
        Me.lbPatentesAsociadas.Visible = True
        Me.lbPatentesDisponibles.Visible = True

        'listamos las patentes ya asociadas a esta familia.
        Me.mlistaPatentesAsociadas = Familia_BL.listarPatentesDeLaFamilia(Me.dgvFamilias.SelectedRows(0).Cells(0).Value)
        'listamos las patentes que pueda tener aún disponibles.
        Me.mlistaTodasLasPatentes = Patente_BL.ListarTodasLasPatentes
        For Each pat1 As Patente_BE In mlistaPatentesAsociadas
            For Each pat2 As Patente_BE In mlistaTodasLasPatentes
                If pat1.Id = pat2.Id Then
                    mlistaTodasLasPatentes.Remove(pat2)
                    Exit For
                End If
            Next
        Next

        ActualizarGrillas()

    End Sub


    'baja
    Private Sub EliminarFamilia_Click(sender As Object, e As EventArgs) Handles btnEliminarFamilia.Click

        'control lista familias vacía.
        If Me.dgvFamilias.RowCount < 1 Then
            MsgBox("No hay familias para borrar..", MsgBoxStyle.Exclamation, "")
            Exit Sub
        End If

        If MsgBox("Se borrará la Familia: " & Me.dgvFamilias.SelectedRows(0).Cells(1).Value.ToString & ", Está seguro??", MsgBoxStyle.OkCancel, "Borrado de la Familia") = MsgBoxResult.Ok Then
            'para no romper la integridad referencial de usuarios-familias, el borrado será lógico. siempre se listaran las familias activas.
            Familia_BL.eliminarFamilia(Me.dgvFamilias.SelectedRows(0).Cells(0).Value)
            'las relaciones familia_patentes si se borrarán porque núnca seran usadas.
            Familia_BL.eliminarPatentesFamilia(Me.dgvFamilias.SelectedRows(0).Cells(0).Value)
            Me.dgvFamilias.DataSource = Nothing
            Me.dgvFamilias.DataSource = Familia_BL.listarFamilias
            Me.dgvFamilias_Click(Nothing, Nothing)
        End If

    End Sub


    'ver patentes de la familia seleccionada.
    Private Sub btnVerPatentes_Click(sender As Object, e As EventArgs) Handles btnVerPatentes.Click

        'control lista familias vacía.
        If Me.dgvFamilias.RowCount < 1 Then
            MsgBox("No hay familias para ver sus patentes..", MsgBoxStyle.Exclamation, "")
            Exit Sub
        End If

        If mOcultar = False Then
            mOcultar = True
            Me.btnVerPatentes.Text = "Ocultar"
            Me.dgvFamilias.Visible = False
            Me.btnNuevaFamilia.Visible = False
            Me.btnModificarFamilia.Visible = False
            Me.btnEliminarFamilia.Visible = False
            Me.mlistaPatentesAsociadas = Familia_BL.listarPatentesDeLaFamilia(Me.dgvFamilias.SelectedRows(0).Cells(0).Value)
            Me.mlistaTodasLasPatentes = Patente_BL.ListarTodasLasPatentes
            Me.dgvPatentesAsociadas.Visible = True
            Me.lbPatentesAsociadas.Visible = True

            'calculamos cuantas disponibles tiene (llenamos la de disponibles con todas las patentes y les quitamos las que ya tiene asignada).
            For Each pat1 As Patente_BE In mlistaPatentesAsociadas
                For Each pat2 As Patente_BE In mlistaTodasLasPatentes
                    If pat1.Id = pat2.Id Then
                        mlistaTodasLasPatentes.Remove(pat2)
                        Exit For
                    End If
                Next
            Next

            Me.lbPatentesDisponibles.Visible = True
            Me.dgvPatentesDisponibles.Visible = True
            ActualizarGrillas()

        Else
            mOcultar = False
            Me.btnVerPatentes.Text = "Ver Patentes"
            Me.dgvFamilias.Visible = True
            Me.btnNuevaFamilia.Visible = True
            Me.btnModificarFamilia.Visible = True
            Me.btnEliminarFamilia.Visible = True
            Me.lbPatentesAsociadas.Visible = False
            Me.dgvPatentesAsociadas.Visible = False
            Me.dgvPatentesAsociadas.DataSource = Nothing
            Me.lbPatentesDisponibles.Visible = False
            Me.dgvPatentesDisponibles.Visible = False
            Me.dgvPatentesDisponibles.DataSource = Nothing
        End If

    End Sub


    'grabar.
    Private Sub GrabarFamilia_Click(sender As Object, e As EventArgs) Handles btnGrabarFamilia.Click

        'CASO GRABAR NUEVA FAMILIA
        If mNuevo = True Then

            'se graba una nueva familia si tiene nombre/descripción y posee al menos una patente asociada.
            If Me.txtNombreFamilia.Text = "" Or Me.txtDescripcionFamilia.Text = "" Or Me.mlistaPatentesAsociadas.Count = 0 Then
                MessageBox.Show("La nueva Familia de tener Nombre y Descripción disitinto de vacío y además al menos una Patente Asociada..")
                Exit Sub
            End If
            'se validó -> se graban los nuevos datos.
            Dim familia As New Familia_BE
            familia.Nombre = txtNombreFamilia.Text
            familia.Descripcion = txtDescripcionFamilia.Text
            'cargarle las patentes asociadas actualmente.
            familia.Patentes = mlistaPatentesAsociadas
            Familia_BL.GrabarNuevaFamiliaConSusPatentes(familia)

            Me.dgvFamilias.DataSource = Nothing
            Me.dgvFamilias.DataSource = Familia_BL.listarFamilias
            mNuevo = False
        Else
            'CASO GRABAR MODIFICACIONES EN LA FAMILIA YA EXISTENTE.
            'se graban las modificaciones de la familia si tiene nombre/descripción y posee al menos una patente asociada.
            If Me.txtNombreFamilia.Text = "" Or Me.txtDescripcionFamilia.Text = "" Or Me.mlistaPatentesAsociadas.Count = 0 Then
                MessageBox.Show("La Familia de tener Nombre y Descripción disitinto de vacío y además al menos una Patente Asociada..")
                Exit Sub
            End If
            'se validó -> se graban las modificaciones.
            Dim familia As New Familia_BE
            familia.Id = Me.dgvFamilias.SelectedRows(0).Cells(0).Value
            familia.Nombre = txtNombreFamilia.Text
            familia.Descripcion = txtDescripcionFamilia.Text
            'cargarle las patentes asociadas actualmente.
            familia.Patentes = mlistaPatentesAsociadas
            Familia_BL.GrabarModificacionesFamiliaConSusPatentes(familia)

            Me.dgvFamilias.DataSource = Nothing
            Me.dgvFamilias.DataSource = Familia_BL.listarFamilias

        End If

        'cosmetica.
        Me.btnNuevaFamilia.Visible = True
        Me.btnModificarFamilia.Visible = True
        Me.btnEliminarFamilia.Visible = True
        Me.btnVerPatentes.Visible = True
        Me.txtNombreFamilia.Text = ""
        Me.txtNombreFamilia.ReadOnly = True
        Me.txtDescripcionFamilia.Text = ""
        Me.txtDescripcionFamilia.ReadOnly = True
        Me.btnGrabarFamilia.Visible = False
        Me.dgvPatentesAsociadas.Visible = False
        Me.dgvPatentesDisponibles.Visible = False
        Me.dgvFamilias.Enabled = True
        Me.btnAsignarPatentes.Visible = False '<<
        Me.btnDesasignarPatentes.Visible = False  '>>
        Me.btnCancelarGrabar.Visible = False
        Me.lbNombreFamilia.Visible = False
        Me.lbDescripcionFamilia.Visible = False
        Me.lbPatentesAsociadas.Visible = False
        Me.lbPatentesDisponibles.Visible = False
        Me.dgvFamilias_Click(Nothing, Nothing)

    End Sub


    'cancelar grabar.
    Private Sub btnCancelarGrabar_Click(sender As Object, e As EventArgs) Handles btnCancelarGrabar.Click
        mNuevo = False
        Me.btnNuevaFamilia.Visible = True
        Me.btnModificarFamilia.Visible = True
        Me.btnEliminarFamilia.Visible = True
        Me.btnVerPatentes.Visible = True
        'cosmetica.
        Me.txtNombreFamilia.Text = ""
        Me.txtNombreFamilia.ReadOnly = True
        Me.txtDescripcionFamilia.Text = ""
        Me.txtDescripcionFamilia.ReadOnly = True
        Me.btnGrabarFamilia.Visible = False
        Me.dgvPatentesAsociadas.Visible = False
        Me.dgvPatentesDisponibles.Visible = False
        Me.dgvFamilias.Enabled = True
        Me.btnAsignarPatentes.Visible = False '<<
        Me.btnDesasignarPatentes.Visible = False  '>>
        Me.btnCancelarGrabar.Visible = False
        Me.lbPatentesAsociadas.Visible = False
        Me.lbPatentesDisponibles.Visible = False
        Me.dgvFamilias_Click(Nothing, Nothing)
    End Sub


    'botón <<
    Private Sub AsignarPatente_Click(sender As Object, e As EventArgs) Handles btnAsignarPatentes.Click

        'control dgv vacío.
        If dgvPatentesDisponibles.RowCount = 0 Then
            MessageBox.Show("No hay patentes disponibles para asociar..")
            Exit Sub
        End If

        'asignación detallada.
        Dim patente As New Patente_BE
        patente.Id = dgvPatentesDisponibles.SelectedRows(0).Cells(0).Value
        patente.Nombre = dgvPatentesDisponibles.SelectedRows(0).Cells(1).Value.ToString
        patente.Descripcion = dgvPatentesDisponibles.SelectedRows(0).Cells(2).Value.ToString
        patente.Tipo = dgvPatentesDisponibles.SelectedRows(0).Cells(3).Value
        mlistaPatentesAsociadas.Add(patente)
        'lo quito de la otra lista.
        Dim salir As Boolean = False
        For Each pat1 As Patente_BE In mlistaPatentesAsociadas
            For Each pat2 As Patente_BE In mlistaTodasLasPatentes
                If pat1.Id = pat2.Id Then
                    mlistaTodasLasPatentes.Remove(pat2)
                    salir = True
                    Exit For
                End If
            Next
            If salir = True Then
                Exit For
            End If
        Next
        ActualizarGrillas()

    End Sub


    'botón >>
    Private Sub DesasignarPatente_Click(sender As Object, e As EventArgs) Handles btnDesasignarPatentes.Click

        'control dgv vacío.
        If dgvPatentesAsociadas.RowCount = 0 Then
            MessageBox.Show("No hay patentes asociadas para quitar..")
            Exit Sub
        End If
        'desasignación detallada.
        Dim patente As New Patente_BE
        patente.Id = dgvPatentesAsociadas.SelectedRows(0).Cells(0).Value
        patente.Nombre = dgvPatentesAsociadas.SelectedRows(0).Cells(1).Value.ToString
        patente.Descripcion = dgvPatentesAsociadas.SelectedRows(0).Cells(2).Value.ToString
        patente.Tipo = dgvPatentesAsociadas.SelectedRows(0).Cells(3).Value
        mlistaTodasLasPatentes.Add(patente)
        'lo quito de la otra lista.
        Dim salir As Boolean = False
        For Each pat1 As Patente_BE In mlistaPatentesAsociadas
            For Each pat2 As Patente_BE In mlistaTodasLasPatentes
                If pat1.Id = pat2.Id Then
                    mlistaPatentesAsociadas.Remove(pat1)
                    salir = True
                    Exit For
                End If
            Next
            If salir = True Then
                Exit For
            End If
        Next
        ActualizarGrillas()

    End Sub


    'salir.
    Private Sub Salir_Click(sender As Object, e As EventArgs) Handles btnSalir.Click
        Me.Close()
        Me.Dispose()
    End Sub


#End Region


#Region "Métodos Auxiliares"

    'cargamos los textbox/labels/chboxs a partir de la fila seleccionada en el dgv.
    Private Sub dgvFamilias_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles dgvFamilias.Click
        If dgvFamilias.RowCount = 0 Then
            Exit Sub
        End If
        Me.txtNombreFamilia.Text = Me.dgvFamilias.SelectedRows(0).Cells(1).Value.ToString
        Me.txtDescripcionFamilia.Text = Me.dgvFamilias.SelectedRows(0).Cells(2).Value.ToString
    End Sub


    Sub ActualizarGrillas()

        Me.dgvPatentesDisponibles.Rows.Clear()
        For Each pat1 As Patente_BE In mlistaTodasLasPatentes
            Me.dgvPatentesDisponibles.Rows.Add(pat1.Id, pat1.Nombre, pat1.Descripcion, CType(pat1.Tipo, Tipo))
        Next

        Me.dgvPatentesAsociadas.Rows.Clear()
        For Each pat2 As Patente_BE In mlistaPatentesAsociadas
            Me.dgvPatentesAsociadas.Rows.Add(pat2.Id, pat2.Nombre, pat2.Descripcion, CType(pat2.Tipo, Tipo))
        Next

    End Sub


    Private Sub frmGestionFamilias_KeyDown(sender As Object, e As KeyEventArgs) Handles MyBase.KeyDown
        If e.KeyCode = Keys.F1 Then
            Help.ShowHelp(Me, Application.StartupPath & "\ayuda_SEAS.chm", "gestionfamilias.htm")
        End If
    End Sub


#End Region


End Class